package com.hooya.fa.eu.api.util;

import cn.hutool.core.date.DateUtil;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @Description 日期扩展
 * @Author : Zongz
 * @Copyright Copyright (c) 豪雅集团
 * @Create 2023/12/14
 * @Version 1.0.0
 */
public class DateExtUtil extends DateUtil {

    static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    /**
     * 获取N天之前日期
     *
     * @param day  天数
     * @param date 日期
     * @return string
     */
    public static String getBeforeNDays(Integer day, String date) {
        return LocalDate.parse(date, formatter).minusDays(day).format(formatter);
    }

    /**
     * 获取N月之前日期
     *
     * @param mon  月数
     * @param date 日期
     * @return string
     */
    public static String getBeforeNMonth(Integer mon, String date) {
        return LocalDate.parse(date, formatter).minusMonths(mon).format(formatter);
    }

    /**
     * 获取昨日信息
     *
     * @param date 日期
     * @return string
     */
    public static String getYesterday(String date) {
        return getBeforeNDays(1, date);
    }

    /**
     * 获取N天之后日期
     *
     * @param day  天数
     * @param date 日期
     * @return string
     */
    public static String getAfterNDays(Integer day, String date) {
        return LocalDate.parse(date, formatter).plusDays(day).format(formatter);
    }

    /**
     * 获取N月之后日期
     *
     * @param mon  月数
     * @param date 日期
     * @return string
     */
    public static String getAfterNMonth(Integer mon, String date) {
        return LocalDate.parse(date, formatter).plusMonths(mon).format(formatter);
    }

    /**
     * 获取上一个月日期，并按指定格式输出
     *
     * @param date   日期
     * @param format 格式
     * @return string
     */
    public static String getPreviousMon(String date, String format) {
        // 解析日期
        LocalDate localDate = LocalDate.parse(date);
        // 获取上一个月的日期
        LocalDate previousMonthDate = localDate.minusMonths(1);
        // 格式化输出
        return previousMonthDate.format(DateTimeFormatter.ofPattern(format));
    }


    /**
     * 跳月集合
     * 例如传入 2024-10-01 ~ 2025-10-01
     * 返回List集合，{{"2024-10-01",”2024-11-01“},{"2024-11-01",“2024-12-01”},...,{"2025-09-01",“2025-10-01”}}
     *
     * @param startDateStr 开始
     * @param endDateStr   结束
     * @return list集合
     */
    public static List<List<String>> generateDateMonthRange(String startDateStr, String endDateStr) {
        List<List<String>> result = new ArrayList<>();
        String currentDateStr = startDateStr.substring(0, 10);
        while (parse(currentDateStr).isBefore(parse(endDateStr))) {
            String nextMonthFirstDay = offsetMonth(parse(currentDateStr), 1).toString().substring(0, 10);
            List<String> dateRange = new ArrayList<>();
            dateRange.add(currentDateStr);
            dateRange.add(nextMonthFirstDay);
            result.add(dateRange);
            currentDateStr = nextMonthFirstDay;
        }
        return result;
    }

    /**
     * 跳日集合
     * 例如传入 2024-10-01 ~ 2024-11-01
     * 返回List集合，{{"2024-10-01",“2024-10-02”},{"2024-10-02",”2024-10-03“},...,{"2024-10-31",”2024-11-01“}}
     *
     * @param startDateStr 开始
     * @param endDateStr   结束
     * @return list集合
     */
    public static List<List<String>> generateDateDayRange(String startDateStr, String endDateStr) {
        List<List<String>> result = new ArrayList<>();
        String currentDateStr = startDateStr.substring(0, 10);
        while (parse(currentDateStr).isBefore(parse(endDateStr))) {
            String nextDay = offsetDay(parse(currentDateStr), 1).toString().substring(0, 10);
            List<String> dateRange = new ArrayList<>();
            dateRange.add(currentDateStr);
            dateRange.add(nextDay);
            result.add(dateRange);
            currentDateStr = nextDay;
        }
        return result;
    }

    /**
     * 获取本月的第一天
     *
     * @return string
     */
    public static String getCurMonthFirstDay(LocalDate date) {
        return returnCurDate(date).with(TemporalAdjusters.firstDayOfMonth()).toString();
    }

    /**
     * 获取本月的最后一天
     *
     * @return string
     */
    public static String getCurMonthLastDay(LocalDate date) {
        return returnCurDate(date).with(TemporalAdjusters.lastDayOfMonth()).toString();
    }

    /**
     * 获取N个月前的第一天
     *
     * @return string
     */
    public static String getBeforeNMonthFirstDay(LocalDate date, int num) {
        return returnCurDate(date).with(TemporalAdjusters.firstDayOfMonth()).minusMonths(num).toString();
    }

    /**
     * 获取N个月前的最后一天
     *
     * @return string
     */
    public static String getBeforeNMonthLastDay(LocalDate date, int num) {
        return returnCurDate(date).minusMonths(num).with(TemporalAdjusters.lastDayOfMonth()).toString();
    }

    /**
     * 获取N个月后的第一天
     *
     * @return string
     */
    public static String getNextMonthFirstDay(LocalDate date, int num) {
        return returnCurDate(date).with(TemporalAdjusters.firstDayOfMonth()).plusMonths(num).toString();
    }

    /**
     * 获取N个月后的最后一天
     *
     * @return string
     */
    public static String getNextMonthLastDay(LocalDate date, int num) {
        return returnCurDate(date).plusMonths(num).with(TemporalAdjusters.lastDayOfMonth()).toString();
    }

    private static LocalDate returnCurDate(LocalDate date) {
        if (Objects.isNull(date)) {
            date = LocalDate.now();
        }
        return date;
    }
}
